package com.jf.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.util.List;

/**
 * StringUtils
 * @author 张昆明
 *
 */
public class StringUtils {

	private final static String[] agent = { "Android", "iPhone", "iPod","iPad", "Windows Phone", "MQQBrowser" }; //定义移动端请求的所有可能类型

	/**
	 * 判断string是否为空
	 * @param strings
	 * @return
	 */
	public static boolean isEmpty(String... strings){
		boolean isFalse = false;
		for(String a:strings){
			if(a == null || a.equals("") || a.equals("undefined") || a.equals("UNDEFINED")){
				isFalse = true;
				break;
			}
		}
		return isFalse;
	}
	
	/**
	 * 保留两位小数
	 */
	public static Double decimalTwo(Double d){
		BigDecimal bd = new BigDecimal(d);
		return bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * 保留n位小数
	 */
	public static Double decimalN(Double d, int n){
		BigDecimal bd = new BigDecimal(d);
		return bd.setScale(n, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * String转Double 当String为空的时候，Double为0
	 */
	public static Double toDouble(String string){
		Double d = 0.00;
		if(!isEmpty(string)){
			d = Double.valueOf(string);
		}
		return d;
	}
	
	
	/**
	* 判断User-Agent 是不是来自于手机
	* @param ua
	* @return
	*/
	public static boolean checkAgentIsMobile(String ua) {
		boolean flag = false;
		if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) {
			// 排除 苹果桌面系统
			if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) {
				for (String item : agent) {
					if (ua.contains(item)) {
						flag = true;
						break;
					}
				}
			}
		}
		return flag;
	}
	
	/**
	 * list 深度copy
	 * @param src
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {  
	    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
	    ObjectOutputStream out = new ObjectOutputStream(byteOut);  
	    out.writeObject(src);  

	    ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
	    ObjectInputStream in = new ObjectInputStream(byteIn);  
	    @SuppressWarnings("unchecked")  
	    List<T> dest = (List<T>) in.readObject();  
	    return dest;  
	} 
	
	/** 
     * 返回中英文字符串的字节长度 
     * @param str 
     * @return 
     */  
    public static int getStrLength(String str) {  
        if (str == null || str.length() == 0) {  
            return 0;  
        }  
        int len = 0;  
        for (int i=0; i<str.length(); i++ ) {  
            //UTF-8编码格式中文占三个字节，GBK编码格式 中文占两个字节 ;  
            len += (str.charAt(i)>255 ? 3 : 1);  
        }  
        return len;  
    }  
	
    /** 
     * 按字节截取字符串 
     * @param str 
     * @param bytes 
     * @return 
     */  
    public static String subStringByBytes(String str, int bytes) {  
        if (str == null || str.length() == 0) {  
            return str;  
        }  
        int len = 0;  
        for (int i=0; i<str.length(); i++ ) {  
            //GBK 编码格式 中文占两个字节 UTF-8 编码格式中文占三个字节;  
            len += (str.charAt(i)>255 ? 3 : 1);   
            if(len>bytes){  
                return str.substring(0,i);  
            }  
        }  
        return str;  
    }  
    
	/**
	 * 按字节截取字符串
	 * @param content 要截取的字符串
	 * @param length 截取长度
	 * @return
	 */
	public static String subString(String content,int length){
         String newStr=subStringByBytes(content,length);
         return newStr;
	}
}
